package logic;

import java.util.Vector;

import javax.swing.JFrame;

import data.*;
import gui.*;

public class AlchemikaGenerator {

	private Vector<Alchemikum> Alchemika = new Vector<Alchemikum>();
	private Vector<Charakter> Charaktere = new Vector<Charakter>();
	private Vector<Verfuegbarkeit> Verfuegbarkeiten = new Vector<Verfuegbarkeit>();
	private Vector<Zutat> Zutaten = new Vector<Zutat>();
	private Vector<Auftrag> Auftraege = new Vector<Auftrag>();
	private Vector<Zauber> Zaubereien = new Vector<Zauber>();
	private ProgrammStatus Status;
	private Vector<Config> Configs = new Vector<Config>();
	private Presentation GUIPresentation;
	private Controller GUIController;
	private IO io;
	private Reactive GUIreactive;
	private ProcessingUnit procUnit;

	/**
	 * Konstruktor
	 */
	public AlchemikaGenerator() {
		this.Status = new ProgrammStatus(0, 0, null);
		this.GUIPresentation = new Presentation(this);
		this.GUIController = new Controller(this);
		this.GUIreactive = new Reactive(this);
		this.io = new IO(this);
		this.procUnit = new ProcessingUnit(this);

//		this.io.generateSamples();
//		this.io.saveAllData();
		this.io.loadAllData();

	    JFrame frame = (JFrame) this.GUIPresentation.getComponent("mainJFrame");
	    frame.setVisible(true);
	    
	    this.procUnit.showCharacter(0);
	    this.procUnit.initializeBrauenView();
	    this.procUnit.showAlchemikum(0);
	    
	    this.GUIController.KomponentenCheckBox.setSelected(true);
	    this.GUIController.AlchemikumComboBox.setSelectedIndex(1);
	    this.GUIController.SubstituteComboBox.setSelectedIndex(2);
	    this.procUnit.selectedOtherSubstitute();
	    this.procUnit.grayoutBrauenButtons();
	}

	/**
	 * @return the ProcessingUnit
	 */
	public ProcessingUnit getProcessingUnit() {
		return procUnit;
	}

	/**
	 * 'Destruktor'
	 */
	public void closeAlchemikaGenerator() {
		this.io.saveAllData();
	}
	
	/**
	 * @return the GUIreactive
	 */
	public Reactive getGUIreactive() {
		return GUIreactive;
	}

	/**
	 * @return the alchemika
	 */
	public Vector<Alchemikum> getAlchemika() {
		return this.Alchemika;
	}

	/**
	 * @return the charaktere
	 */
	public Vector<Charakter> getCharaktere() {
		return this.Charaktere;
	}

	/**
	 * @return the verfuegbarkeiten
	 */
	public Vector<Verfuegbarkeit> getVerfuegbarkeiten() {
		return this.Verfuegbarkeiten;
	}

	/**
	 * @return the zutaten
	 */
	public Vector<Zutat> getZutaten() {
		return this.Zutaten;
	}

	/**
	 * @return the auftraege
	 */
	public Vector<Auftrag> getAuftraege() {
		return this.Auftraege;
	}

	/**
	 * @return the zaubereien
	 */
	public Vector<Zauber> getZaubereien() {
		return this.Zaubereien;
	}

	/**
	 * @return the status
	 */
	public ProgrammStatus getStatus() {
		return this.Status;
	}

	/**
	 * @return the configs
	 */
	public Vector<Config> getConfigs() {
		return this.Configs;
	}

	/**
	 * @return the gUIPresentation
	 */
	public Presentation getGUIPresentation() {
		return this.GUIPresentation;
	}

	/**
	 * @return the gUIController
	 */
	public Controller getGUIController() {
		return this.GUIController;
	}

	/**
	 * @return the io
	 */
	public IO getIo() {
		return this.io;
	}

	/**
	 * @param alchemika the alchemika to set
	 */
	public void setAlchemika(Vector<Alchemikum> alchemika) {
		Alchemika = alchemika;
	}

	/**
	 * @param charaktere the charaktere to set
	 */
	public void setCharaktere(Vector<Charakter> charaktere) {
		Charaktere = charaktere;
	}

	/**
	 * @param verfuegbarkeiten the verfuegbarkeiten to set
	 */
	public void setVerfuegbarkeiten(Vector<Verfuegbarkeit> verfuegbarkeiten) {
		Verfuegbarkeiten = verfuegbarkeiten;
	}

	/**
	 * @param zutaten the zutaten to set
	 */
	public void setZutaten(Vector<Zutat> zutaten) {
		Zutaten = zutaten;
	}

	/**
	 * @param auftraege the auftraege to set
	 */
	public void setAuftraege(Vector<Auftrag> auftraege) {
		Auftraege = auftraege;
	}

	/**
	 * @param zaubereien the zaubereien to set
	 */
	public void setZaubereien(Vector<Zauber> zaubereien) {
		Zaubereien = zaubereien;
	}

	/**
	 * @param status the status to set
	 */
	public void setStatus(ProgrammStatus status) {
		Status = status;
	}

	/**
	 * @param configs the configs to set
	 */
	public void setConfigs(Vector<Config> configs) {
		Configs = configs;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new AlchemikaGenerator();
	}

}
